#ifndef CPP_POWERMANAGER_H
#define CPP_POWERMANAGER_H

#include <vector>
#include <utils/WakeLock.h>
#include <utils/Timer.h>

//@brief 电源管理
//@author cvte
//@description 提供设备电源管理状态的设置和获取
class PowerManager {
   public:
    friend class MainWindow;
    friend class WakeLock;

    class PowerManagerListener {
       public:
        virtual void onSystemSleep();
        virtual void onSystemWakeup();
    };

    static const int PARTIAL_WAKE_LOCK = 0x01; //保持CPU唤醒
    static const int FULL_WAKE_LOCK = 0x02; //保持不灭屏

    static const int TP_WAKEUP_KEY_NOKEY = 0;   //不送KEY
    static const int TP_WAKEUP_KEY_POWERKEY = 1; //发送KEYCODE_POWER
    static const int TP_WAKEUP_KEY_WAKEUP = 2;   //发送KEYCODE_WAKEUP事件

    static PowerManager* getInstance();
    //@method 新建一个唤醒锁，不用通过new WakeLock创建
    WakeLock* newWakeLock(int level, const char* name);
    //@method 系统进入睡眠
    bool sleep();
    //@method 系统唤醒
    void wakeup();
    //@method 屏幕是否亮
    bool isScreenOn();
    //@method 设置自动进入睡眠的时间，单位秒，如果设置小于0，就相当于关闭自动睡眠功能
    void setAutoSleepTime(int second);
    //@method 获取是否打开自动睡眠
    bool isAutoSleep();
    //@method 让自动睡眠计时器重新计时
    void resetAutoSleepTimer();
    //@method 自动睡眠定时器触发，内部调用，返回true代表继续执行定时
    bool autoSleepTimerProc();
    //@method 设置电源管理监听器
    void setListener(PowerManagerListener& listener);
    //@method 获取电源管理监听器
    PowerManagerListener* getListener();
    //@method 设置TP唤醒时，发送的按键类型
    void setTpWakeupKeyType(int type);

   private:
    typedef std::vector<WakeLock*> WakeLockVector;

    static PowerManager* sInstance;
    WakeLockVector mWakeLockVector;
    Timer mAutoSleepTimer;
    int mAutoSleepTimeTotal = 0;
    int mAutoSleepTimeRemain = 0;
    int mAutoSleepTimerInterval = 0; //自动睡眠定时器定时周期，单位秒
    PowerManagerListener* mListener = nullptr;
    bool mIsWakeuping = false; //指示是否在进入唤醒过程中，仅通过屏幕亮灭状态判断不准确
    bool mIsSleeping = false; //指示是否在进入睡眠过程中，仅通过屏幕亮灭状态判断不准确
    bool mIsWakeupPowerKey = false; //指示是否是唤醒时的powerkey，仅通过屏幕亮灭状态判断不准确
    bool mIsSleepPowerKey = false; //指示是否是睡眠时的powerkey，仅通过屏幕亮灭状态判断不准确

    PowerManager();
    ~PowerManager();
    //@method 移除一个唤醒锁，不需要主动调用，WakeLock在析构时会调用此方法
    void removeWakeLock(WakeLock* wakeLock);
    //@method 一个唤醒锁上锁
    void onWakeLockAcquired(WakeLock* wakeLock);
    //@method 一个唤醒锁解锁
    void onWakeLockReleased(WakeLock* wakeLock);
    //@method 通知Power Key触发一次
    void notifyPowerKey();
    //@method 自动睡眠定时器处理函数
    static bool autoSleepTimerTask(Timer& timer);
};

#endif